package cn.tedu.jsd2210.csmall.product.service.impl;

import cn.tedu.jsd2210.csmall.product.ex.ServiceException;
import cn.tedu.jsd2210.csmall.product.mapper.AttributeMapper;
import cn.tedu.jsd2210.csmall.product.pojo.dto.AttributeAddNewDto;
import cn.tedu.jsd2210.csmall.product.pojo.dto.AttributeUpdateDto;
import cn.tedu.jsd2210.csmall.product.pojo.entity.Attribute;
import cn.tedu.jsd2210.csmall.product.pojo.entity.Brand;
import cn.tedu.jsd2210.csmall.product.pojo.vo.AttributeListItemVO;
import cn.tedu.jsd2210.csmall.product.pojo.vo.AttributeStandardVO;
import cn.tedu.jsd2210.csmall.product.pojo.vo.BrandListItemVO;
import cn.tedu.jsd2210.csmall.product.pojo.vo.BrandStandardVO;
import cn.tedu.jsd2210.csmall.product.service.IAttributeService;
import cn.tedu.jsd2210.csmall.product.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class AttributeServiceImpl implements IAttributeService {
    @Autowired
    private AttributeMapper attributeMapper;


    @Override
    public void addNew(AttributeAddNewDto attributeAddNewDto) {
        log.debug("开始处理[添加属性]业务,参数:{}",attributeAddNewDto);
        Long templateId=attributeAddNewDto.getTemplateId();
        String name=attributeAddNewDto.getName();
        int count = attributeMapper.countByNameAndTemplate(name,templateId);
        log.debug("根据名称[{}],模板ID[{}]统计数量,结果:{}",name,templateId,count);
        if(count>0){
            String message="添加属性失败,属性名称已被占用!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT,message);
        }

        //创建实例对象
        Attribute attribute=new Attribute();
        //复制属性
        BeanUtils.copyProperties(attributeAddNewDto,attribute);
        attribute.setIsAllowCustomize(0);
        //调用mapper插入数据
        int rows = attributeMapper.insert(attribute);
        if(rows!=1){
            String message="添加属性失败,服务器忙,请稍后再试!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_INSERT,message);
        }
    }

    @Override
    public void deleteById(Long id) {
        log.debug("开始处理[根据ID:{}删除属性]的业务",id);
        AttributeStandardVO queryResult = attributeMapper.getStandardById(id);
        if(queryResult==null){
            String message="删除属性失败,尝试删除的属性数据不存在!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND,message);
        }
        log.debug("开始执行[根据ID:{}删除属性]",id);
        int rows = attributeMapper.deleteById(id);
        if(rows!=1){
            String message="删除属性失败,服务器忙,请稍后再试!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_DELETE,message);
        }
    }

    @Override
    public void updateInfoById(AttributeUpdateDto attributeUpdateDto, Long id) {
        log.debug("开始处理[根据ID:{}修改属性]的业务",id);
        AttributeStandardVO queryResult = attributeMapper.getStandardById(id);
        if(queryResult==null){
            String message="修改属性失败,尝试修改的属性数据不存在!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND,message);
        }
        String name=attributeUpdateDto.getName();
        if(name==null){
            name=attributeMapper.getStandardById(id).getName();
        }
        Long templateId=attributeUpdateDto.getTemplateId();
        if(templateId==null){
            templateId=attributeMapper.getStandardById(id).getTemplateId();
        }
        int count = attributeMapper.countByNameAndTemplateAndNotId(name,templateId,id);
        log.debug("count:{}",count);
        if(count>0){
            String message="添加属性失败,对应模板的属性名称已被占用!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT,message);
        }

        log.debug("开始执行[根据ID:{}修改属性]",id);
        Attribute attribute=new Attribute();
        BeanUtils.copyProperties(attributeUpdateDto,attribute);
        attribute.setId(id);
        int rows = attributeMapper.update(attribute);
        if(rows<1){
            String message="修改属性失败,服务器忙,请稍后再试!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_UPDATE,message);
        }
    }

    @Override
    public AttributeStandardVO getStandardById(Long id) {
        log.debug("开始处理[根据ID:{}查询属性详情]的业务",id);
        AttributeStandardVO queryResult = attributeMapper.getStandardById(id);
        if(queryResult==null){
            String message="查询类别失败,尝试查询的属性数据不存在!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND,message);
        }
        return queryResult;
    }

    @Override
    public List<AttributeListItemVO> list() {
        log.debug("开始处理查询属性列表的业务,无参数");
        List<AttributeListItemVO> list = attributeMapper.list();
        return list;

    }

    @Override
    public List<AttributeListItemVO> listByTemplateId(Long templateId) {
        log.debug("开始处理根据templateId:[{}]查询属性列表的业务",templateId);
        List<AttributeListItemVO> listByTemplateId = attributeMapper.listByTemplateId(templateId);
        return listByTemplateId;
    }
}
